package com.kuangstudy.controller.login;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.google.code.kaptcha.Constants;
import com.kuangstudy.config.userlocal.KConstants;
import com.kuangstudy.entity.User;
import com.kuangstudy.service.user.IUserService;
import com.kuangstudy.utils.pwd.MD5Util;
import com.kuangstudy.vo.UserVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpSession;

/**
 * @author zhangfushuai
 * @description 登陆页面
 * @since 2022/4/17 18:28
 **/
@Controller
public class LoginController {

    @Autowired
    private IUserService userService;

    /**
     * @author zhangfushuai
     * @description 跳转到登陆页面 - 将用户信息添加到session中
     * @since 2022/4/17 18:28
     * 参数 session
     * @return java.lang.String
     **/
    @GetMapping("/login")
    public String login(HttpSession session) {
        // 1:获取用户登录的信息
        User user = (User) session.getAttribute(KConstants.SESSION_USER);
        // 2:如果已经登录
        if (user != null) {
            // 3:直接服务器端重定向到首页
            return "redirect:/collect";
        }
        // 4:否则代表没有登录，直接去登录页面
        return "login/login";
    }

    /**
     * @author zhangfushuai
     * @description 退出登陆 - 清除session
     * @since 2022/4/17 18:28
     * 参数 session
     * @return java.lang.String
     **/
    @GetMapping("/logout")
    public String logout(HttpSession session) {
        // 注销所有的session
        session.invalidate();
        // 2:否则代表没有登录，直接去登录页面
        return "redirect:/login";
    }

    /**
     * @author zhangfushuai
     * @description 处理登录逻辑，判断当前用户是否可以登陆，进行用户信息校验
     * @since 2022/4/17 18:29
     * 参数 userVo
     * 参数 session
     * @return java.lang.String
     **/
    @ResponseBody
    @PostMapping("/logined")
    public String logined(@RequestBody UserVo userVo, HttpSession session) {
        //1: 根据账号去查询用户信息
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(User::getNickname, userVo.getAccount());
        User user = userService.getOne(lambdaQueryWrapper);
        // 2: 如果用户存在直接抛异常
        if (user == null) {
            return "fail";
        }

        // 3: 比较验证码？
        String userinputcode = userVo.getCode();
        String sessioncode = (String) session.getAttribute(Constants.KAPTCHA_SESSION_KEY);

        // 4：采用equalsIgnoreCase忽略大小写比较，不论你输入大写还小写还是全大写还全小写都可以，只要值相同都相同
        boolean codeFlag = userinputcode.equalsIgnoreCase(sessioncode);
        if (!codeFlag) {
            // 如果不相同，直接返回
            return "failcode";
        }

        // 5：把用户输入的密码进行加密
        String inputpwd = MD5Util.md5slat(userVo.getPassword());
        // 6：然后把用户输入的密码进行加密和数据库已经加密的密码进行比较，如果一致，就说明是正确的。
        if (MD5Util.md5slat(user.getPassword()).equals(inputpwd)) {
            // 7: 正确的话，就把登录的用户信息放到session中。
            session.setAttribute(KConstants.SESSION_USER, user);
            return "success";
        }

        // 8：不一致用户密码不存在
        return "fail";
    }

    /**
     * @author zhangfushuai
     * @description 异步获取session中用户信息
     * @since 2022/4/17 18:32
     * 参数 session
     * @return com.kuangstudy.entity.User
     **/
    @PostMapping("/login/loadsession")
    @ResponseBody
    public User toSessionUser(HttpSession session) {
        return (User) session.getAttribute(KConstants.SESSION_USER);
    }
}
